from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from django import http
import random,logging # 导入随机模块，准备生成短信验证码
from . import constants
# 导入模块
from verifications.libs.captcha.captcha import captcha
from meiduo_mall.utils.response_code import RETCODE # 导入响应码模块
from verifications.libs.yuntongxun.ccp_sms import CPP # 导入短信验证码模块
# 创建日志输出器
logger=logging.getLogger("django")

class SMSCodeView(View):
    """短信验证码"""
    def get(self,request,mobile):
        """
        发送短信验证码
        :param request:
        :param mobile: 手机号
        :return: JSON
        """
        # 接收参数
        image_code_client = request.GET.get("image_code")
        uuid=request.GET.get("uuid")
        # 校验参数
        if not all([image_code_client,uuid]):
            return http.HttpResponseForbidden("缺少必传参数")

        # 创建连接到redis的对象
        redis_conn=get_redis_connection("verify_code")
        # 判断用户是否频繁发送短信
        send_flag = redis_conn.get("send_flag_%s"%mobile)
        if send_flag:
            return http.JsonResponse({"code":RETCODE.THROTTLINGERR,"errmsg":"发送短信过于频繁"})

        # 提取图形验证码
        redis_conn = get_redis_connection("verify_code")
        image_code_server=redis_conn.get("img_%s"%uuid)
        if image_code_server is None:
            return http.JsonResponse({"code":RETCODE.IMAGECODEERR,
                                      "errmsg":"图形验证码已失效"},
                                     json_dumps_params={"ensure_ascii":False})
        # 删除图形验证码
        redis_conn.delete("img_%s"%uuid)
        # 对比图形验证码,注意：直接从redis读取出来的数据是字节类型，需要解码成字符串
        # 为了让图形验证码不区分大小写，我们统一变成小写进行比较
        if image_code_client.lower()!=image_code_server.decode().lower():
            return http.JsonResponse({"code":RETCODE.IMAGECODEERR,
                                      "errmsg":"输入图形验证码有误"},
                                     json_dumps_params={"ensure_ascii":False})

        # 生成短信验证码
        sms_code="%04d"%random.randint(0,9999)
        logger.info(sms_code) # 手动输出日志，记录短信验证码

        # # 保存短信验证码到redis数据库
        # redis_conn.setex("sms_%s"%mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
        # # 保存发送短信验证码的标记: setex send_flag_mobile 60 1
        # redis_conn.setex("send_flag_%s"%mobile,constants.SEND_SMS_CODE_INTERVAL,1)

        # 创建redis管道
        pl = redis_conn.pipeline()
        # 将命令添加到队列中
        # 保存短信验证码到redis数据库
        pl.setex("sms_%s"%mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
        # 保存发送短信验证码的标记: setex send_flag_mobile 60 1
        pl.setex("send_flag_%s"%mobile,constants.SEND_SMS_CODE_INTERVAL,1)
        # 执行命令
        pl.execute()
        # 发送短信验证码到用户手机
        result = CPP().sendTemplateSMS(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES//60],constants.SEND_SMS_TEMPLATE_ID)
        print("result=",result)
        # 响应处理结果
        return http.JsonResponse({"code":RETCODE.OK,"errmsg":"短信发送成功"},
                                 json_dumps_params={"ensure_ascii":False})

# Create your views here.
class ImageCodeView(View):
    """图片验证码模块"""
    def get(self,request,uuid):
        """
        :param uuid:通用唯一识别码，用于唯一标识该图形验证码属于哪个用户
        :return: image/jpg
        """
        # 接收参数和校验参数：在路由中已经做过了，不需要重复做了
        # 实现主体业务逻辑：生成、保存、响应图片验证码
        # 生成图片验证码
        text,image = captcha.generate_captcha()
        # 保存图形验证码
        redis_conn = get_redis_connection("verify_code")
        # redis_conn.setex("key","expires","value")
        redis_conn.setex("img_%s"%uuid,constants.IMAGE_CODE_REDIS_EXPIRES,text)
        # 响应图形验证码
        # return http.HttpResponse("响应体","数据类型")
        return http.HttpResponse(image,content_type="image/jpg")


